// Copyright (C) Kumo inc. and its affiliates.
// Author: Jeff.li lijippy@163.com
// All rights reserved.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
//

package repository

import (
	"fmt"

	"github.com/cheggaaa/pb/v3"
)

// DisableProgress implement the DownloadProgress interface and disable download progress
type DisableProgress struct{}

// Start implement the DownloadProgress interface
func (d DisableProgress) Start(url string, size int64) {}

// SetCurrent implement the DownloadProgress interface
func (d DisableProgress) SetCurrent(size int64) {}

// Finish implement the DownloadProgress interface
func (d DisableProgress) Finish() {}

// ProgressBar implement the DownloadProgress interface with download progress
type ProgressBar struct {
	bar  *pb.ProgressBar
	size int64
}

// Start implement the DownloadProgress interface
func (p *ProgressBar) Start(url string, size int64) {
	p.size = size
	p.bar = pb.Start64(size)
	p.bar.Set(pb.Bytes, true)
	p.bar.SetTemplateString(fmt.Sprintf(`download %s {{counters . }} {{percent . }} {{speed . "%%s/s" "? MiB/s"}}`, url))
}

// SetCurrent implement the DownloadProgress interface
func (p *ProgressBar) SetCurrent(size int64) {
	p.bar.SetCurrent(size)
}

// Finish implement the DownloadProgress interface
func (p *ProgressBar) Finish() {
	p.bar.Finish()
}
